C++ 第三方库编译

引言

本文旨在阐述 C++ 第三方库的编译与使用,具体参考了 B 站大佬 无限十三年 的视频:CMake 开源库的编译与使用

一.在 Windows 系统上编译与使用第三方库

使用 CMake 管理与编译 C++ 第三方库的流程包含两个方面,一个是编译库,一个是使用库。

1.编译库

下面是编译第三方库的流程图:

flowchart TD
    A([Start]) --> B[下载源代码]
    B --> C[用 CMake 配置
生成项目文件] C --> D[编译项目代码] D --> E[安装到指定路径] E --> F([End]) %% 定义节点样式,例如将为开始和结束节点填充为绿色 classDef startEnd fill:#90EE90 class A,F startEnd

2.使用库

下面是使用第三方库的流程图:

flowchart TD
    A([Start]) --> B[建立项目并编写代码]
    B --> C[编写 CMakeLists.txt 
配置第三方库] C --> D[生成项目] D --> E[编译运行] E --> F([End]) %% 定义节点样式,例如将为开始和结束节点填充为绿色 classDef startEnd fill:#90EE90 class A,F startEnd

3.编译与使用第三方库

这里以数据序列化的常用库 jsoncpp 1.9.6 版本为例进行编译使用:

前期准备

  1. 首先下载源代码,途径是多种多样的,我这里通过 jsoncpp GitHub 仓库 或者 jsonncpp Gitee 仓库 获取。注意切换到自己需要的版本标签拉取
    拉取源代码.png

[!tip] 注意
根据实际情况新建下面几个文件夹(这几个文件夹可以在任意自己需要的地方):

  1. build_vs:用于构建 msvc 的 jsoncpp 项目
  2. install_vs:用于在 msvc 环境中生成并安装 jsoncpp 的头文件以及库文件。方便后续项目使用。
  3. build_mingw:用于构建 mingw 环境的 jsoncpp 项目
  4. install_mingw:用于在 mingw 环境中生成并安装 jsoncpp 的头文件以及库文件。方便后续项目使用。

笔者的配置路径做如下参考:

1
2
3
4
5
6
7
8
9
10
11
#-MSVS编译--------------------------------------------------------------------------#
# 第三方库构建目录(MSVC 版本)后续均简述为 build_vs
D:\SoftWare\DeveloperEnv\JSON\jsoncpp-1.9.6-build-debug\build_vs
# 第三方库安装目录(MSVC 版本)后续均简述为 install_vs
D:\SoftWare\DeveloperEnv\JSON\jsoncpp-1.9.6-install-debug\install_vs

#-MinGW编译-------------------------------------------------------------------------#
# 第三方库构建目录(MinGW 版本)后续均简述为 build_mingw
D:\SoftWare\DeveloperEnv\JSON\jsoncpp-1.9.6-build-debug\build_mingw
# 第三方库安装目录(MinGW 版本)后续均简述为 install_mingw
D:\SoftWare\DeveloperEnv\JSON\jsoncpp-1.9.6-install-debug\install_mingw

[!tip] 注意
如果不采用本文这种安装方式也可以参考 恋恋风辰大佬 的方式编译与使用。

对于一个 C++ 项目,最终会包含三个目录:includelibbin,可以自己去找这些项目的然后集中放置在一处,当然,也可以通过刚刚的 install 目录进行统一安装。

1.MSVC 环境下编译与使用 jsoncpp

编译阶段

  1. 通过 CMake(cmake-gui) 程序打开此第三方库,具体的配置为:
  • Where is the source code 项选择第三方库的主 CMakeLists.txt 所在的路径。
  • Where to build the binaries 项选择刚刚创建的 build_vs 目录。

详细配置图如下所示:

构建路径选择(MSVC).png

  1. 然后点击 Configure 按钮并选择生成工程类型,这里选择 MSVC 版本,详细如下图所示:

配置生成环境(MSVC).png

  1. 然后在 Search 栏输入 install 更改安装路径(install_vs目录),这样后续第三方库编译之后能直接将头文件,库文件,可执行文件等直接安装到这一目录。然后直接生成工程即可。具体可见下图:

选择安装路径并生成工程(MSVC).png

  1. 在文件资源管理器中打开 build_vs 目录,找到解决方案并打开。

打开MSVC解决方案.png

  1. 选择 debug 模式并将 INSTALL 项设为启动项目,然后右键生成,详情如下图所示:

安装jsoncpp库.png

  1. 进入 install_vs 根目录,可以看到生成了头文件,库文件以及可执行文件。

安装MSVC版库.png

至此,MSVC 版本的 jsoncpp 库编译完成。

使用阶段

  1. 进入第三方库源代码根目录可以看到有个 example 文件夹,里面有一部分例程供测试环境使用。这里拷贝一个 readFromString 工程到合适的地方。然后进入此工程的根目录,创建 CMakeLists.txt 文件以及 build 文件夹,完成之后工程结构如下图所示:

工程结构(MSVC).png

  1. 用合适的编辑器打开 CMakeLists.txt 文件然后输入如下内容并保存:
1
2
3
4
5
6
7
8
9
10
cmake_minimum_required(VERSION 3.5)
project(readFromString)

# 设置 jsoncpp cmake配置目录
set(JSONCPP_DIR D:/SoftWare/DeveloperEnv/JSON/jsoncpp-1.9.6-install-debug/install_vs/lib/cmake/jsoncpp)
# 查找 jsoncpp 包
find_package(JSONCPP)

add_executable(readFromString WIN32 readFromString.cpp)
target_link_libraries(readFromString PRIVATE JsonCpp::JsonCpp)
  1. 进入 build 目录打开终端并执行如下命令生成 VS 工程:
1
2
# 使用 cmake 命令构建生成工程
cmake ..

生成结果如下所示:

构建生成项目.png

[!tip] 注意
这里使用这一条简洁命令是因为 Windows 系统下默认指定 MSVC 编译器,因此无需指定 cmake 命令的 -G 参数。想要查看默认编辑器,可以通过 cmake --help 查看。

  1. 然后打开 build 目录生成的解决方案。将 readFromString 项设为启动项目并执行生成操作。

[!tip] 注意
这里需要注意的是,在 readFromString 项右键选中,然后依次点击属性->配置属性->链接器->系统,在子系统栏选择控制台,不然此工程编译会报错。
设置子系统为控制台终端.png

  1. 编译成功后,在 Visual Studio 中运行此程序,最后弹出控制台结果如下所示则为成功。

测试结果.png

至此,MSVC 版本的 jsoncpp 库编译使用流程便梳理清楚了。

2.MinGW 环境下编译与使用 jsoncpp

编译阶段

  1. 通过 CMake(cmake-gui) 程序打开此第三方库,具体的配置为:
  • Where is the source code 项选择第三方库的主 CMakeLists.txt 所在的路径。
  • Where to build the binaries 项选择刚刚创建的 build_mingw 目录。

详细配置图如下所示:

构建路径选择(MinGW).png

  1. 然后点击 Configure 按钮并选择生成工程类型,这里选择 MinGW 版本,详细如下图所示:

配置生成环境(MinGW).png

  1. 然后在 Search 栏输入 install 更改安装路径(install_mingw目录),这样后续第三方库编译之后能直接将头文件,库文件,可执行文件等直接安装到这一目录。然后直接生成工程即可。具体可见下图:

选择安装路径并生成工程(MinGW).png

  1. 进入 build_mingw 目录并在此目录打开终端,然后输入下面命令构建编译 MinGW 版本的第三方库。
1
cmake --build . -j4

具体执行如下图所示:

MinGW构建编译三方库.png

  1. 然后执行下述命令安装 jsoncpp 库到 install_mingw 目录
1
cmake --install .

具体执行如下所示:

MinGW安装三方库.png

  1. 进入 install_mingw 根目录,可以看到生成了头文件,库文件以及可执行文件。

安装MinGW版库.png

至此,MinGW 版本的 jsoncpp 库编译完成。

使用阶段

  1. 进入第三方库源代码根目录可以看到有个 example 文件夹,里面有一部分例程供测试环境使用。这里拷贝一个 stringWrite 工程到合适的地方。然后进入此工程的根目录,创建 CMakeLists.txt 文件以及 build 文件夹,完成之后工程结构如下图所示:

工程目录结构.png

  1. 用合适的编辑器打开 CMakeLists.txt 文件然后输入如下内容并保存:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cmake_minimum_required(VERSION 3.5)
project(stringWrite)

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)

# 查找 jsoncpp 包,使用CONFIG模式【替换为 jsoncpp 实际安装路径】
list(APPEND CMAKE_PREFIX_PATH "D:/SoftWare/DeveloperEnv/JSON/jsoncpp-1.9.6-install-debug/install_mingw")
find_package(jsoncpp CONFIG REQUIRED) # 注意这里包名使用小写

# 添加你的可执行文件
add_executable(stringWrite stringWrite.cpp)

# 链接到JsonCpp的目标,注意目标名的大小写和命名空间
target_link_libraries(stringWrite PRIVATE JsonCpp::JsonCpp)
  1. 进入 build 目录,执行如下命令完成示例项目构建:
1
cmake -S .. -G "MinGW Makefiles"

运行指令结果如下所示:

构建项目.png

  1. 紧接着在 build 目录,执行如下命令进行项目编译:
1
cmake --build .

运行指令结果如下所示:

编译项目.png

  1. 依旧是在 build 目录运行编译生成的可执行程序,示例结果如下所示:

至此,MinGW 版本的 jsoncpp 库编译使用流程便梳理清楚了。